第24天來介紹最後一個開發API常用工具,負責保護請求安全的神器「Spring Security」,在HTTP請求的部分提供了身分驗證、授權,以及常見的CSRF、XSS攻擊的防範,此外也能防止SQL注入,確保相關邏輯處理的安全性,由於現階段會以API開發為主,接下來幾篇重點會在授權和驗證的應用為主
這邊先來做重點複習,先前有提到SpringMVC能設定過濾器,進入Spring MVC前對請求做的處理,接著才會進入Spring MVC的內,此時已經在Spring應用內,能使用相關元件,Spring Security就是利用過濾器的特性,實現身份驗證和授權,操作過程可以拆成兩大部分
為了方便吸收內容今天先講解第一點配置的用法
添加依賴項目
<!-- Spring Secutiry -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring Security Test Dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
新增config資料夾並建立Spring Security配置類SecurityConf.java
此處要注意,由於篇幅有限會省略無關的配置設定,專注以路由請求的配置為主,以及配置方式會因為Spring Security版本不同,引用到的類別也有異動,此例為 6.1.3
先依文件範例建置請求設定
@Configuration
@EnableWebSecurity
public class BasicConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> {
// 這段表示驗證每個請求
authorize
.anyRequest()
.authenticated()
})
}
}
為了方便測試先時候打開,之前寫好的 ApiTest.java,並修改Mock依賴環境如下
@BeforeEach
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
// 添加這行,表示測試會套用 Spring Security 配置
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
接著執行上篇寫好的 checkGenerateJwtOk 測試
輸入指令 mvn test -Dtest=ApiTest#checkGenerateJwtOk
顯示403錯誤表示,表示Spring Security的配置生效,因為 authenticated 預設執行身分驗證,目前請求中並無攜帶相關驗證資訊, Spring Security就會認定身分驗證失敗,要能正常操作必須將 /api/jwt 的路徑規則,忽略請求認證現在來改寫 Security 設定
http
.authorizeHttpRequests((authorize) -> {
authorize
.requestMatchers("/api/member/**").authenticated()
.anyRequest().permitAll();
});
改寫規則對 /api/member開頭的請求會進行驗證,其他路徑則不進行驗證動作,因此在執行一次 ApiTest#checkGenerateJwtOk 進行測試,會是出綠燈,傳寫測試
@Test
public void getMember() throws Exception {
mockMvc.perform(MockMvcRequestBuilders
.get("/api/member"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
執行 mvn test -Dtest=ApiTest#getMember就會出現紅燈,那麼基本配置已經完成了,下篇文章在來添加過濾器,實現自訂驗證請求的操作